package com.ddm.controller.web;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.ddm.entity.webEntity.PaymentRecord;
import com.ddm.result.Result;
import com.ddm.service.webService.PaymentService;
import com.ddm.service.webService.PlanService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.time.LocalDate;
import java.util.List;

@Slf4j
@RestController
@RequestMapping("/payment")
public class PaymentController {
    @Resource
    private PaymentService paymentService;
    @Resource
    private PlanService planService;


    /**
     * 修改订单支付状态
     */
    @PostMapping("/updateStatus")
    @Operation(summary = "修改订单支付状态", description = "支持已支付→取消状态变更")
    public Result<PaymentRecord> updatePaymentStatus(
            @Parameter(description = "订单编号", required = true)
            @RequestParam String orderNo,
            @Parameter(description = "新状态（枚举值：UNPAID, PAID, FAILED,REFUNDED）", required = true)
            @RequestParam String newStatus) {

        try {
            log.info("修改订单状态请求：orderNo={}, newStatus={}",
                    orderNo, newStatus);
            // 调用服务层方法修改状态
            PaymentRecord updatedRecord = paymentService.updatePaymentStatus(orderNo, newStatus);
            return Result.success(updatedRecord);
        } catch (IllegalArgumentException e) {
            // 处理参数校验异常
            log.warn("修改订单状态参数错误：{}", e.getMessage());
            return Result.error(e.getMessage());
        } catch (Exception e) {
            // 处理其他异常
            log.error("修改订单状态失败", e);
            return Result.error("修改订单状态失败：" + e.getMessage());
        }
    }

    /**
     * 根据订单号查询订单
     */
    @GetMapping("/getByOrderNo")
    public Result<PaymentRecord> getPaymentByOrderNo(
            @RequestParam @NotBlank(message = "订单号不能为空") String orderNo
    ) {
        try {
            PaymentRecord payment = paymentService.getPaymentByOrderNo(orderNo);
            if (payment == null) {
                return Result.error("订单不存在");
            }
            return Result.success(payment);
        } catch (Exception e) {
            log.error("查询订单失败，orderNo: {}", orderNo, e);
            return Result.error("查询订单失败：" + e.getMessage());
        }
    }

    /**
     * 根据用户ID分页查询订单记录
     */
    @GetMapping("/pageById")
    public Result<IPage<PaymentRecord>> queryPaymentPage(
            @RequestParam @NotNull(message = "页码不能为空") int pageNum,
            @RequestParam @NotNull(message = "每页条数不能为空") int pageSize,
            @RequestParam @NotBlank(message = "用户ID不能为空") String userId
    ) {
        try {
            // 调用服务层分页查询方法
            IPage<PaymentRecord> paymentPage = paymentService.queryPaymentPage(pageNum, pageSize, userId);
            return Result.success(paymentPage);
        } catch (Exception e) {
            log.error("分页查询用户订单失败，userId: {}", userId, e);
            return Result.error("查询订单失败：" + e.getMessage());
        }
    }

    @PostMapping("/add")
    public Result<PaymentRecord> addPaymentRecord(
            @RequestParam @NotNull(message = "用户ID不能为空") Integer userId,
            @RequestParam @NotNull(message = "套餐ID不能为空") Integer planId,
            @RequestParam @NotNull(message = "订单状态不能为空") String orderStatus
    ) {
        try {
            // 调用Service层的新增方法
            PaymentRecord createdRecord = paymentService.createPaymentRecord(userId, planId, orderStatus);
            if (createdRecord != null) {
                return Result.success(createdRecord);
            } else {
                return Result.error("新增订单失败：数据库保存失败");
            }
        } catch (IllegalArgumentException e) {
            return Result.error(e.getMessage());
        } catch (Exception e) {
            log.error("新增订单异常，userId: {}, planId: {}", userId, planId, e);
            return Result.error("新增订单失败：" + e.getMessage());
        }
    }

    /**
     * 订单记录列表查询（支持多条件筛选+分页）
     * 适用场景：管理员查询所有订单、用户查询自己的订单（可筛选状态/时间）
     * @param userId      可选，用户ID（筛选指定用户的订单，null则查所有）
     * @param orderStatus 可选，订单状态（如 "待支付"、"已支付"、"已取消"，null则不筛选）
     * @param startDate   可选，开始日期（筛选该日期后创建的订单，格式：yyyy-MM-dd）
     * @param endDate     可选，结束日期（筛选该日期前创建的订单，格式：yyyy-MM-dd）
     * @param page
     * @param pageSize 分页参数（页码+每页条数，默认 page=1，pageSize=10）
     * @return 分页后的订单列表
     */
    @GetMapping("/list")
    public Result<List<PaymentRecord>> queryPaymentList(
            // 筛选条件：用户ID（可选，支持String类型，兼容前端可能传递的字符串ID）
            @RequestParam(required = false) String userId,
            // 筛选条件：订单状态（可选，与PaymentRecord的orderStatus字段类型一致）
            @RequestParam(required = false) String orderStatus,
            // 筛选条件：开始日期（可选，前端传递 yyyy-MM-dd 格式字符串）
            @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate startDate,
            // 筛选条件：结束日期（可选，同上）
            @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate endDate,
            // 分页参数（复用通用DTO，自动校验页码≥1、每页条数1-100）
            @RequestParam(defaultValue = "1") Integer page,
            @RequestParam(defaultValue = "10") Integer pageSize
    ){
        try {
            // 2. 调用Service层，传递筛选条件和分页参数
            IPage<PaymentRecord> paymentPage = paymentService.getPaymentList(
                    userId, orderStatus, startDate, endDate, page, pageSize
            );
            return Result.success(paymentPage.getRecords());
        } catch (Exception e) {
            log.error("订单列表查询失败，userId: {}, orderStatus: {}", userId, orderStatus, e);
            return Result.error("查询订单列表失败：" + e.getMessage());
        }
    }

    @DeleteMapping("/delete")
    Result<String> deletePayment(
            @Parameter(description = "订单编号", required = true)
            @RequestParam String orderNo
    ){
        Result result=paymentService.deletePaymentRecord(orderNo);
        return result;
    }
    }


